/**
 * 计算在给定背包重量下，能够获得的最大价值。
 * @param {number} bagWeight - 背包的最大重量。
 * @param {number[]} value - 各个物品的价值数组。
 * @param {number[]} weight - 各个物品的重量数组。
 * @returns {number} 能够获得的最大价值。
 */
function package(bagWeight, value, weight) {
  // 初始化一个数组，用于存储每个重量下能够获得的最大价值。
  const line = [];
  for (let i = 0; i <= bagWeight; i++) {
    // 对于每个重量，如果当前重量大于等于第一个物品的重量，则可以考虑选择该物品，否则价值为0。
    line[i] = i >= weight[0] ? value[0] : 0;
  }
  // 遍历每个物品，更新当前重量下能够获得的最大价值。
  for (let i = 1; i < value.length; i++) {
    const next = []; // 用于存储当前物品下每个重量能够获得的最大价值。
    for (let j = 0; j <= bagWeight; j++) {
      // 如果当前重量小于当前物品的重量，则不能选择该物品，价值与上一次相同。
      if (j < weight[i]) {
        next[j] = line[i];
      }
      // 更新当前重量下能够获得的最大价值，选择当前物品或不选择当前物品中的较大值。
      next[j] = Math.max(value[i] + line[j - weight[i]], line[j]);
    }
    line = next; // 更新状态数组为当前物品的最大价值数组。
  }
  // 返回背包最大重量下的最大价值。
  return line[bagWeight];
}

const result = package(6, [5, 10, 3, 6, 3], [2, 5, 1, 3, 4]);
console.log(result); // 13
